#include <iostream>
#include <string>
#include <regex>

int main()
{
    // HTTP请求行格式：GET /path/login?username=zhangsan&password=123456 HTTP/1.1\r\n
    std::string str = "GET /path/login HTTP/1.1\r\n";
    std::smatch matches;// 保存结果的容器

    // 
    std::regex rgx("(GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\\?(.*))? (HTTP/1\\.[01])(?:\n|\r\n)?");
    /*
        (GET|HEAD|POST|PUT|DELETE)：匹配并提取其中任意一个字符串，直到遇到空格
        ([^?]*)：[^?]匹配非'?'字符，*表示匹配0次或多次，()提取
        \\?(.*) ：\\?表示'?'字符，(.*)表示提取任意字符，即匹配并提取'?'之后的任意字符，直到遇到空格
        (HTTP/1\\.[01])：[01]表示匹配0或1，\\.表示'.'，(HTTP/1\\.[01])表示匹配并提取以'HTTP/1.'开头且以0或1结尾的字符串
        (?:\n|\r\n)?：(?:字符串)表示匹配指定格式字符串但不提取，后面的'?'表示匹配前面的表达式0次或1次
        (?:\\?(.*))?：与上同理
    */
    bool ret = std::regex_match(str, matches, rgx);
    if(ret == false) return -1;
    for(const auto& s : matches)
    {
        std::cout << s << std::endl;
    }

    return 0;
}